#include "netdisk.h"

// 实现文件和目录的创建、删除等功能

//版本1 创建一个文件夹，创建成功返回0，创建失败返回errno
int mkdir_1(const char *dir1 ,char *pdir ) { 
    char subpath[256] = {0};
    sprintf(subpath,"%s/%s",pdir,dir1);
    mode_t mode;
    sscanf("0777","%o",&mode);
    int ret = mkdir(subpath,mode);
    if(ret == 0)
        return 0;
    else
        return errno;
}
//版本2，一次性创建多个文件夹,不支持递归创建，0表示全部创建成功，否则返回最后一个失败的errno
int mkdirFunc(const char *dir1 ,Stack_t pdir ) {
    char str[1024];
    strcpy(str,dir1);
    int idx = 0;
    char *p[1024];
    p[idx++] = strtok(str," ");
    //printf("%s\n",p[0]);
    while((p[idx++] = strtok(NULL," ")) != NULL);
    //printf("%s\n",p[idx-1]);
    char subpath[256] = {0};
    int ret = 0;
    for(int i = 0; i < idx && p[i] != NULL; i++)
    {
        //需要在此处循环调用onePath函数，得到拼接好的路径
        onePath(p[i],subpath, &pdir);
        //sprintf(subpath,"%s/%s",pdir,p[i]);
        //printf("%s\n",subpath);
        mode_t mode;
        sscanf("0777","%o",&mode);
        int retVal = mkdir(subpath,mode);
        if(retVal == -1)
            ret = -1;
    }
    return ret;
}
//#include "head.h"
//版本1，只删除1个目录,0表示删除成功，-1表示删除失败
int rmdir_1(const char *dir1 ,char *pdir ) {
    //char *p = getpwd();
    char subpath[256] = {0};
    sprintf(subpath,"%s/%s",pdir,dir1);
    int ret = rmdir(subpath);
    return ret;//0表示删除成功，-1表示删除失败
}

//版本2 删除多个空目录,支持递归删除，0表示全部删除成功，-1表示存在删除失败,
int rmdirFunc(const char *dir1 , Stack_t pdir ) {
    // const char *dir1:指向要删除的目录路径的常量字符指针
    // Stack_t *pdir:指向栈结构的指针，栈中存储当前的工作目录路径
    char str[1024]; // 用于存储目录路径
    strcpy(str,dir1); // 使用 strcpy 将传入的目录路径复制到str
    int idx = 0; // 用于跟踪分割路径的元素
    char *p[1024]; // 用于存储分割路径的元素
    p[idx++] = strtok(str," "); // 使用strtok函数分割str，以空格为分隔符，并将第一个元素存入到 p 数组
    //printf("%s\n",p[0]);
    while((p[idx++] = strtok(NULL," ")) != NULL) // 继续使用strtok 函数发呢个够剩余的路径，直到没有更多的元素
        //printf("%s\n",p[idx-1]);
    printf("%d\n",idx);// 打印分割后的路径元素数量
    // 声明一个字符数组 subpath，用于存储构建的子路径 
    char subpath[256] = {0};
    int ret = 0;
    // 构建子路径并删除目录
    for(int i = 0; i < idx && p[i] != NULL; i++)
    {
        //需要在此处循环调用onePath函数，得到拼接好的路径
        onePath(p[i],subpath,&pdir);// 使用onePath 函数构造完整的子路径
        //sprintf(subpath,"%s/%s",pdir,p[i]);
        //printf("%s\n",subpath);
        int retVal = rmdir(subpath); // 调用rmdir函数尝试删除构建的子路径所指向的目录
        if(retVal == -1)
            ret = -1;


    }
    return ret;//0表示删除成功，-1表示删除失败
}
//版本一，删除一个文件
int remove_1(const char *filename, char *pdir)
{
    char subpath[256] = {0};
    sprintf(subpath,"%s/%s",pdir,filename);
    int retVal = unlink(subpath);
    if(retVal == -1)
        return errno;
}

//版本二，删除多个文件，支持递归删除，全部成功删除返回0，否则返回最后一个失败的1
// const char *filenam：要删除的文件的名称
int removeFunc(const char *filename, Stack_t pdir)
{
    char str[1024];// 存储文件名
    strcpy(str,filename); // 将filename赋值为str
    int idx = 0;      // 存储分割后的字符串
    char *p[1024];  // 存储分割后的字符串
    p[idx++] = strtok(str," ");
    //printf("%s\n",p[0]);
    
    // 循环分割字符串，直至没有更多的分隔符
    while((p[idx++] = strtok(NULL," ")) != NULL);
    //printf("%s\n",p[idx-1]);
    
    // 初始化子路径数组和返回值
    char subpath[256] = {0};
    int ret = 0;
    // 循环删除文件
    for(int i = 0; i < idx && p[i] != NULL; i++)
    {
        //需要在此处循环调用onePath函数，得到拼接好的路径
        onePath(p[i],subpath, &pdir);
        //sprintf(subpath,"%s/%s",pdir,p[i]);
        //printf("%s\n",subpath);
        // 使用unlink函数尝试删除subpath指向的文件
        int retVal = unlink(subpath);
        if(retVal == -1)
            ret = -1;
    }
    return ret;
}

